|
Technote 1127
In Search of... ...Missing Links*
(*íçÅgÉXÉ^Å[ÉgÉåÉbÉNÅhÇΔÇÕä÷åWdžÇËÇ‹ÇπÇÒÅB)
ñ‚ëË: åáóéÉãÅ[É`Éì
ÉNÉâÉVÉbÉN 68K Çà API ÇÃÇ¢Ç≠ǬǩÇÕ PowerPC Ç®ÇÊÇ— CFM-68K
Çà InterfaceLib Ç…ä‹Ç‹ÇÍǃǢNjÇπÇÒÅBǪǧǵÇΩÉãÅ[É`ÉìÇ CFM
ÉRÅ[ÉhÇ©ÇÁåƒÇ—èoÇ∑ÇΔÅAÉvÉçÉOÉâÉÄÇÃÉäÉìÉNéûÇ…ÅuÉVÉìÉ{ÉãÇ™âåàÇ≈ǴǻǢÅvÇΔǢǧÉGÉâÅ[Ç™î≠ê∂ǵNjÇ∑ÅB
Å@
âåàçÙ:
ÉOÉãÅ[ÇèëÇ≠
DZÇà TECHNOTE
Ç≈íÒãüÇ∑ÇÈÇÃÇÕàÍéûìIÇ»âåàçÙÇ≈ÅAÉvÉçÉOÉâÉÄÇ…ÉCÉìÉNÉãÅ[ÉhÇ≈Ç´ÇÈÉOÉãÅ[ÉRÅ[ÉhÇÃçÏê¨ï˚ñ@Çê‡ñæÇµÇ‹Ç∑ÅBåáóéǵÇΩ
API ǪÇÍǺÇÍDžǬǢǃ 1
ǬÇ∏ǬÉOÉãÅ[ÉãÅ[É`ÉìÇèëÇ≠ïKóvǙdžÇËÇ‹Ç∑ÅBäeÉãÅ[É`ÉìÇÕ 68K A
ÉgÉâÉbÉvÇÃÉAÉhÉåÉXÇåàíËǵÅAìKêÿÇ»ÉpÉâÉÅÅ[É^ÇéwíËǵǃÅACallUniversalProc
Ç© CallOSTrapUniversalProc ÇåƒÇ—èoǵNjÇ∑ÅBè´óàåáóéǵǃǢÇÈ
API Çä‹ÇfiêVǵǢ InterfaceLib
ÉtÉ@ÉCÉãÇ™ÉäÉäÅ[ÉXÇ≥ÇÍÇΩÇÁÅAÉOÉãÅ[ÉtÉ@ÉCÉãǻǵÇ≈ÉvÉçÉWÉFÉNÉgÇÉrÉãÉhǵíºÇ∑DZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB
Å@
ä»íPÇ»ÉTÉìÉvÉã
(îÒèÌÇ…ä»íPÇ» 4 ó·)
íçà”: éüÇà 4 ǬÇà API ÇÕåáóé API Ç≈ÇÕÇ»Ç≠ÅAÇøÇ·ÇÒÇΔ
InterfaceLib
Ç…ì¸Ç¡ÇƒÇ¢Ç‹Ç∑ÅBä»íPÇ»ó·Çé¶Ç∑ñ⁄ìIÇ≈éÊÇËè„Ç∞NjǵÇΩÅB
<MacWindows.h> Ç…ÇÕ
InitWindowsÅASelectWindowÅAFrontWindowÅACheckUpdate
Ç™éüÇÃÇÊǧDžíËã`Ç≥ÇÍǃǢNjÇ∑ÅB
extern pascal void InitWindows(void)
ONEWORDINLINE(0xA912);
Å@
extern pascal void SelectWindow(WindowPtr's theWindow)
ONEWORDINLINE(0xA91F);
Å@
extern pascal WindowPtr FrontWindow(void)
ONEWORDINLINE(0xA924);
Å@
extern pascal Boolean CheckUpdate(EventRecord *theEvent)
ONEWORDINLINE(0xA911);
|
InitWindows ÇÃèÍçáÅAéüÇÃÇÊǧDž A
ÉgÉâÉbÉvÇÃÉAÉhÉåÉXÇΔ Pascal å^Çà ProcInfo ÇéwíËǵǃ
CallUniversalProc ÇåƒÇ—èoǵNjÇ∑ÅB
pascal void InitWindows(void)
// ONEWORDINLINE(0xA912);
{
CallUniversalProc(GetToolboxTrapAddress(0xA912),
kPascalStackBased);
}
|
ǪÇÍÇŸÇ«ÇfiÇ∏ǩǵÇ≠džÇËÇ‹ÇπÇÒÇ≈ǵÇΩÇÀÅBGetToolboxTrapAddress
Çà 0xA912 ǙǫDZǩÇÁóàǃǢÇÈÇ©ÇÌÇ©ÇÁǻǢï˚ÇÃÇΩÇflÇ…ÅAǪÇÍÇÕ
ONEWORDINLINE É}ÉNÉçDždžÇËÇ‹Ç∑ÅB<Traps.h>
ÇÃíÜÇ©ÇÁíTÇ∑DZÇΔLJÇ≈Ç´Ç‹Ç∑ÅBÇ≥džÅAéüÇÕÉpÉâÉÅÅ[É^ÇìnÇ∑ó·Ç≈Ç∑ÅB
extern pascal void SelectWindow(WindowPtr theWindow)
// ONEWORDINLINE(0xA91F);
{
CallUniversalProc(GetToolboxTrapAddress(0xA91F),
kPascalStackBased |
STACK_ROUTINE_PARAMETER(1,SIZE_CODE(sizeof(WindowPtr))),
theWindow // the parameter
);
}
|
âΩLJÇfiÇ∏ǩǵǢDZÇΔÇÕdžÇËÇ‹ÇπÇÒÅBprocinfo Ç…
STACK_ROUTINE_PARAMETER
É}ÉNÉçÇâ¡Ç¶ÅAÉpÉâÉÅÅ[É^Çí«â¡ÇµÇ‹ÇµÇΩÅBéüÇÕílÇï‘Ç∑ó·Ç≈Ç∑ÅB
extern pascal WindowPtr FrontWindow(void)
// ONEWORDINLINE(0xA924);
{
return (WindowPtr) CallUniversalProc(
GetToolboxTrapAddress(0xA924),
kPascalStackBased |
RESULT_SIZE(SIZE_CODE(sizeof(WindowPtr)))
);
}
|
DZÇÍÇÕ RESULT_SIZE
É}ÉNÉçÇégǡǃÅAÉXÉ^ÉbÉNè„ÇÃåãâ ÇÃÉTÉCÉYÇíËã`ǵNjÇ∑ÅBCallUniversalProc
Ç™ï‘Ç∑ long Ç WindowPtr
Ç…å^ïœä∑ǵǻÇ≠ǃÇÕÇ»ÇÁǻǢDZÇΔÇ…íçà”ǵǃÇ≠ÇæÇ≥Ç¢ÅBÇ≥ǃÅADZDZNjÇ≈äwèKǵÇΩDZÇΔÇëgÇ›çáÇÌÇπǃǛNjǵÇÂǧÅBéüÇÕÅAÉpÉâÉÅÅ[É^Ç™
1 å¬Ç≈ÅAílÇï‘Ç∑ API Ç≈Ç∑ÅB
extern pascal Boolean CheckUpdate(EventRecord *theEvent)
// ONEWORDINLINE(0xA911);
{
return (Boolean) CallUniversalProc(
GetToolboxTrapAddress(0xA911),
kPascalStackBased |
RESULT_SIZE(SIZE_CODE(sizeof(Boolean))) |
STACK_ROUTINE_PARAMETER(1,SIZE_CODE(sizeof(EventRecord*)))
);
}
|
ÉåÉWÉXÉ^ÉxÅ[ÉXÇÃ
A ÉgÉâÉbÉv
ÉIÉyÉåÅ[ÉeÉBÉìÉOÉVÉXÉeÉÄÇ÷Çà A
ÉgÉâÉbÉvÇÕÉpÉâÉÅÅ[É^ÇÉåÉWÉXÉ^Ç≈ìnǵNjÇ∑ÅBÉAÉbÉvÉãÇÕç≈ãfl
PBXGetVolInfo (PBX ÇÃÅuXÅvÇ…íçñ⁄) ÇÃ A
ÉgÉâÉbÉvÇì±ì¸ÇµÇ‹ÇµÇΩÅBDZÇÍÇÕ PBGetVolInfo
ÇÃÇÊǧDžìÆçÏǵNjÇ∑Ç™ÅAêVÇΩÇ…ëÂóeó É{ÉäÉÖÅ[ÉÄèÓïÒÇï‘Ç∑DZÇΔÇ™Ç≈Ç´ÇÈÇÊǧDžǻÇËNjǵÇΩÅBCFM
Ç©ÇÁÇÕéüÇÃÇÊǧDžǵǃåƒÇ—èoÇ∑DZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB
// åxçê: DZÇÃÉRÅ[ÉhÇÕégÇÌǻǢÇÊǧDž - å„ë±ÇÃÉZÉNÉVÉáÉìÇì«ÇÒÇ≈Ç≠ÇæÇ≥Ç¢ÅB
//#pragma parameter __D0 PBXGetVolInfoSync(__A0)
pascal OSErr PBXGetVolInfoSync(XVolumeParamPtr paramBlock)
// TWOWORDINLINE(0x7012, 0xA060);
{
return (OSErr) CallOSTrapUniversalProc(
(UniversalProcPtr) GetOSTrapAddress(0xA060),
kRegisterBased |
RESULT_SIZE(SIZE_CODE(sizeof(OSErr))) |
REGISTER_RESULT_LOCATION(kRegisterD0) |
REGISTER_ROUTINE_PARAMETER(1, kRegisterD0,
kTwoByteCode) | // selector
REGISTER_ROUTINE_PARAMETER(2, kRegisterA0,
SIZE_CODE(sizeof(XVolumeParamPtr*))),
0x0012, // selector
paramBlock); // parameter(s)
}
// åxçê: DZÇÃÉRÅ[ÉhÇÕégÇÌǻǢÇÊǧDž - å„ë±ÇÃÉZÉNÉVÉáÉìÇì«ÇÒÇ≈Ç≠ÇæÇ≥Ç¢ÅB
|
ç≈èâÇ…íçñ⁄ǵǃǟǵǢÇÃÇÕÅACallUniversalProc
Ç≈ÇÕÇ»Ç≠ÅACallOSTrapUniversalProc
ÇégópǵǃǢÇÈDZÇΔÇ≈Ç∑ÅBCallOSTrapUniversalProc ä÷êîÇÕÅAOS
ÇÃ A
ÉgÉâÉbÉvÇé¿çsÇ∑ÇÈïWèÄìIÇ»åƒÇ—èoǵï˚ñ@DžǵÇΩǙǡǃÅAéwíËÇÃÉÜÉjÉoÅ[ÉTÉãÉvÉçÉVÅ[ÉWÉÉÉ|ÉCÉìÉ^Ç…ëŒâûÇ∑ÇÈÉãÅ[É`ÉìÇé¿çsǵNjÇ∑ÅBA1ÅAA2ÅAD1ÅAD2
ÇÃÉåÉWÉXÉ^ÇÕÉãÅ[É`ÉìÇ™é¿çsÇ≥ÇÍÇÈëOÇ…ï€ë∂Ç≥ÇÍÅAé¿çsäÆóπå„Ç…ïúå≥Ç≥ÇÍÇ‹Ç∑ÅBÇ≥ÇÁÇ…ÅAÉgÉâÉbÉvÉèÅ[Éhì‡ÇÃÉtÉâÉOÉrÉbÉgÇ™ê›íËÇ≥ÇÍǃǢÇÈÇΩÇflÅAÉåÉWÉXÉ^
A0 LJï€ë∂ïúå≥Ç≥ÇÍÇ‹Ç∑ÅB
ÉZÉåÉNÉ^ (0x0012)
ÇÕÇ«ÇÃÇÊǧDžåàíËǵÇΩÇÃÇ≈ǵÇÂǧǩÅBMacsBug Ç≈ TWOWORDINLINE
Çà 16 êiÉRÅ[ÉhÇÉfÉBÉXÉAÉZÉìÉuÉãÇ∑ÇÈÇΔÅAéüÇÃÇÊǧDžǻÇËÇ‹Ç∑ÅB
MacsBug> dh 7012 A060
MOVEQ #$12,D0
_FSDispatch
|
åÎâǵǻǢÇ≈Ç≠ÇæÇ≥Ç¢ÅBAPI ÇΔ xWORDINLINE ÇÃèÓïÒÇÕ
Universal Interface Ç©ÇÁíºê⁄ÉRÉsÅ[ǵǃǢNjÇ∑ÅBDZÇÃèÍçáÇÕ
pragma
ÉpÉâÉÅÅ[É^Çå©ÇÈÇΔÅAÇ«ÇÃÉåÉWÉXÉ^ǙǫDZÇ≈égÇÌÇÍǃǢÇÈǩǙÇÌÇ©ÇËÇ‹Ç∑
(OSErr ÇÕ DO Ç…ÅAXVolumeParamPtr ÉpÉâÉÅÅ[É^ÇÕ
A0)ÅBêÊÇÃèÍçáÇÃÇÊǧDžÅAxWORDINLINE
É}ÉNÉçÇÉfÉBÉXÉAÉZÉìÉuÉãÇ∑ÇÈÇΔÅAÉZÉåÉNÉ^èÓïÒÇΔ A
ÉgÉâÉbÉvÇ™ìæÇÁÇÍÇ‹Ç∑ÅBProcInfo Ç… kD0DispatchedRegisterBased
ÇÃåƒÇ—èoǵãKë•ÇÕǻǢÇÃÇ≈ÅADO
ÉZÉåÉNÉ^LJëºÇÃÉåÉWÉXÉ^ÉxÅ[ÉXÇÃÉpÉâÉÅÅ[É^ÇΔìØÇ∂ÇÊǧDžèàóùÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅB
Å@
GetToolboxTrapAddress ÇÃë„ÇÌÇËÇ… GetOSTrapAddress
ÇégǡǃǢÇÈDZÇΔÇ…íçñ⁄ǵǃÇ≠ÇæÇ≥Ç¢ÅBDZÇÍÇ…ÇÊǡǃï ÇÃñ‚ëËÇ™î≠ê∂ǵNjÇ∑ÅBOS
Çà A ÉgÉâÉbÉvÇ…ÇÕÅAA ÉgÉâÉbÉvÇÃÉrÉbÉg 9 ÇΔÉrÉbÉg 10
Ç≈ÉtÉâÉOÇìnÇ∑LJÇÃǙdžÇÈÇÃÇ≈Ç∑ÅBó·Ç¶ÇŒÅAéüÇà NewPrt
Çå©ÇƒÇ≠ÇæÇ≥Ç¢ÅB
_NewPtr = 0xA11E
_NewPtrSys = 0xA51E
_NewPtrClear= 0xA31E
_NewPtrSysClear = 0xA71E
|
ǬNjÇËÅAÉrÉbÉg 9 ÇÕ 'Sys' ÉrÉbÉgÇ≈ÅAÉrÉbÉg 10 ÇÕ
'Clear' ÉrÉbÉgÇ≈džÇÈDZÇΔÇ™ÇÌÇ©ÇËÇ‹Ç∑ÅBDZÇÍÇÁ 4 ǬÇà A
ÉgÉâÉbÉvÇÕÅAíPìΔÇÃÉfÉBÉXÉpÉbÉ`ÉÉÅ[Çí Ç∂ǃèàóùÇ≥ÇÍÅAÉtÉâÉOÉrÉbÉgÇ≈Ç«ÇÃÉãÅ[É`ÉìÇåƒÇ—èoÇ∑ǩǙåàÇ‹ÇËÇ‹Ç∑ÅBÇ≤ë∂Ç∂Ç≈Ç∑Ç©ÅBPBXGetVolInfoSync
(0xA060) Çà A ÉgÉâÉbÉvLJìØólÇ≈Ç∑ÅB
_FSDispatch = 0xA060
_HFSDispatch = 0xA260
_FSDispatchAsync = 0xA460
_HFSDispatchAsync = 0xA660
|
Trap Manager ÇÃè⁄ç◊DžǬǢǃÇÕÅAÅwInside Macintosh:
Operating Systems UtilitiesÅxÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB
ǪÇÍÇ≈ÇÕÅAA ÉgÉâÉbÉvÉfÉBÉXÉpÉbÉ`ÉÉÅ[ÇÕÅAÇ«Çà A
ÉgÉâÉbÉvÇåƒÇ—èoÇ∑ÇÃÇ©ÇǫǧǵǃîªífÇ∑ÇÈÇÃÇ≈ǵÇÂǧǩÅBA
ÉgÉâÉbÉvÇÕ D1 ÉåÉWÉXÉ^Ç≈ìnǵNjÇ∑ÅBÇ≈Ç∑Ç©ÇÁÅAè„ãLÇÃ
PBXGetVolInfoSync ÇÃÉOÉãÅ[ÇèCê≥Ç∑ÇÈÇ…ÇÕÅAD1 ÉåÉWÉXÉ^Ç≈ A
ÉgÉâÉbÉvÇìnÇ∑DZÇΔÇ Mixed Mode Manager
Ç…ì`ǶÇÈï ÇÃÉpÉâÉÅÅ[É^Çí«â¡Ç∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅB
íçà”:
DZDZÇ≈ÇÕèáèòÇ™ÇΩÇ¢Ç÷ÇÒèdóvÇ≈Ç∑ÅBCFM ÉOÉãÅ[Ç™ CFM
ÉRÅ[ÉhÇ≈ÉpÉbÉ`Ç≥ÇÍÇΩÉgÉâÉbÉvÇåƒÇ—èoǵǃǢǃÅAProcInfo
ÉpÉâÉÅÅ[É^ÇÃèáèòÇ™ìØÇ∂Ç≈ǻǩǡÇΩÇÁÅAǪÇÃÉpÉbÉ`ÇÕå≥ÇÃÉpÉâÉÅÅ[É^ÇÃèáî‘Ç≈åƒÇ—èoÇ≥ÇÍÇ‹Ç∑ÅBê≥ãKÇÃèáèòÇÕÅAÉZÉåÉNÉ^
(ïKóvÇ»èÍçá)ÅAD1 (A
ÉgÉâÉbÉv)ÅAçÇãâåæåÍÇÃÉvÉçÉgÉ^ÉCÉvÇ…åªÇÍÇÈèáèòÇ≈ï¿ÇÒÇæÉpÉâÉÅÅ[É^Ç≈Ç∑ÅB
pascal OSErr PBXGetVolInfoSync(XVolumeParamPtr paramBlock)
// TWOWORDINLINE(0x7012, 0xA060);
{
return (OSErr) CallOSTrapUniversalProc (
(UniversalProcPtr) GetOSTrapAddress(0xA060),
kRegisterBased |
RESULT_SIZE(SIZE_CODE(sizeof(OSErr))) |
REGISTER_RESULT_LOCATION(kRegisterD0) |
REGISTER_ROUTINE_PARAMETER(1, kRegisterD0,
kTwoByteCode) | // selector
REGISTER_ROUTINE_PARAMETER(2, kRegisterD1,
kTwoByteCode) | // A-Trap
REGISTER_ROUTINE_PARAMETER(3, kRegisterA0,
SIZE_CODE(sizeof(XVolumeParamPtr*))),
0x0012, // selector
0xA060, // A-Trap
paramBlock); // parameter(s)
}
|
ÉåÉWÉXÉ^Ç≈ÉfÉBÉXÉpÉbÉ`Ç≥ÇÍÇÈ
A ÉgÉâÉbÉv
ÉåÉWÉXÉ^Ç≈ÉfÉBÉXÉpÉbÉ`Ç≥ÇÍÇÈ A
ÉgÉâÉbÉvÇ≈ÇÕÅAÉZÉåÉNÉ^ÇÉåÉWÉXÉ^ D0 Ç‹ÇΩÇÕ D1
ÇÃÇ¢Ç∏ÇÍÇ©Ç≈ìnÇ∑ïKóvǙdžÇËÇ‹Ç∑ÅBéüÇ…é¶Ç∑ÇÃÇÕÅAç≈ãflÇ‹Ç≈
CFM-68K Çà InterfaceLib Ç©ÇÁåáóéǵǃǢÇΩ AppleGuide API
Ç≈Ç∑ÅB
pascal AGErr AGGeneral(AGRefNum refNum, AGEvent theEvent)
// TWOWORDINLINE(0x700D, 0xAA6E);
{
return (AGErr) CallUniversalProc(GetToolboxTrapAddress(0xAA6E),
kD0DispatchedPascalStackBased |
RESULT_SIZE(SIZE_CODE(sizeof(AGErr))) |
DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode) |
DISPATCHED_STACK_ROUTINE_PARAMETER(1,
SIZE_CODE(sizeof(refNum))) |
DISPATCHED_STACK_ROUTINE_PARAMETER(2,
SIZE_CODE(sizeof(theEvent))),
0x000D, // selector -> D0
refNum,theEvent // the parameters
);
}
|
DZÇÃÉRÅ[ÉhÇ≈ç≈èâÇ…íçñ⁄ǵǃǟǵǢÇÃÇÕÉZÉåÉNÉ^
(0x0012) Ç≈Ç∑ÅBTWOWORDINLINE É}ÉNÉçÇ©ÇÁ MacsBug
Ç≈ílÇéÊìæÇ∑ÇÈÅAéüÇÃï˚ñ@ÇäoǶǃǮǢǃÇ≠ÇæÇ≥Ç¢ÅB
MacsBug> dh 700D AA6E
MOVEQ #$0D,D0
_AGGeneral
|
DZDZǩÇÁÅADZÇà API Ç™ D0
Ç≈ÉfÉBÉXÉpÉbÉ`Ç≥ÇÍÇÈDZÇΔÇ™ófiêÑÇ≈Ç´Ç‹Ç∑ÅBÇ≥ǃÅADISPATCHED_STACK_ROUTINE_SELECTOR_SIZE
Ç…égópÇ∑ÇÈê≥ǵǢílÇÕÅAÇ«ÇÃÇÊǧDžǵǃí≤Ç◊ÇΩÇÁÇÊÇ¢ÇÃÇ≈ǵÇÂǧǩÅBLJǧàÍìxÅAéüÇÃÇÊǧDžǵǃ
MacsBug Ç≈ÅA_AppleGuideDispatch Çà A
ÉgÉâÉbÉvÇí Ç∂ǃÉfÉBÉXÉpÉbÉ`Ç≥ÇÍÇÈ API
ÇÃÉäÉXÉgÇéÊìæÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB
MacsBug> api AA6E
Å@
° AA6E _AppleGuideDispatch
DO.W=0001 AGOpen
DO.W=0002 AGOpenWithSearch
DO.W=0003 AGOpenWithSequence
<...>
|
DZÇÃåãâ Ç©ÇÁÅAÉZÉåÉNÉ^ÇÕé¿ç€Ç…ÇÕÉèÅ[ÉhÉxÅ[ÉXÇæÇΔǢǧDZÇΔÇ™ÇÌÇ©ÇËÇ‹Ç∑ÅBÇ≈Ç∑Ç©ÇÁÅADISPATCHED_STACK_ROUTINE_SELECTOR_SIZE
Ç…ÇÕ kTwoByteCode ÇΔǢǧílÇéwíËǵNjÇ∑ÅB
Å@
ÉXÉ^ÉbÉNÇ≈ÉfÉBÉXÉpÉbÉ`Ç≥ÇÍÇÈ
A ÉgÉâÉbÉv
ÉXÉ^ÉbÉNÇ≈ÉfÉBÉXÉpÉbÉ`Ç≥ÇÍÇÈ A
ÉgÉâÉbÉvÇ…ÇÕÅAÉXÉ^ÉbÉNÇ≈ÉZÉåÉNÉ^ÇìnÇ∑ïKóvǙdžÇËÇ‹Ç∑ÅBTEGetPoint
ÇÕ InterfaceLib
Ç…ä‹Ç‹ÇÍǃǢNjÇ∑Ç™ÅADZDZÇ≈ÇÕDZÇÍÇó·ÇΔǵǃéÿÇËǃÅAíçà”ì_Çê‡ñæÇµÇ‹Ç∑ÅB
// åxçê: DZÇÃÉRÅ[ÉhÇÕégÇÌǻǢÇÊǧDž - å„ë±ÇÃíióéÇì«ÇÒÇ≈Ç≠ÇæÇ≥Ç¢ÅB
static Point TEGetPoint(short offset,TEHandle hTE)
{
// THREEWORDINLINE(0x3F3C, 0x0008, 0xA83D);
// MOVE.W #$0008,-(A7)
// _TEDispatch
// _TEGetPoint is A83D (_TEDispatch) when A7^.W=0008
// A7^.W=0008 ÇÃÇΔÇ´ _TEGetPoint ÇÕ A83D (_TEDispatch)
return (Point) CallUniversalProc(
GetToolboxTrapAddress(_TEDispatch), // ÉfÉBÉXÉpÉbÉ`ÉÉÅ[ÇÃÉAÉhÉåÉX
kStackDispatchedPascalStackBased | // proc info
RESULT_SIZE(SIZE_CODE(sizeof(Point))) |
DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode) |
DISPATCHED_STACK_ROUTINE_PARAMETER(1,
SIZE_CODE(sizeof(short))) |
DISPATCHED_STACK_ROUTINE_PARAMETER(2,
SIZE_CODE(sizeof(TEHandle))),
0x0008, // selector -> stack
offset, hTE // parameter(s)
);
}
// åxçê: DZÇÃÉRÅ[ÉhÇÕégÇÌǻǢÇÊǧDž - å„ë±ÇÃíióéÇì«ÇÒÇ≈Ç≠ÇæÇ≥Ç¢ÅB
|
ç°ìxÇÕÅAÉZÉåÉNÉ^ÇÕÉXÉ^ÉbÉNè„ÇÃÉèÅ[ÉhÇΔǵǃìnÇ≥ÇÍÇ‹Ç∑ÅBÇ®ÇÌÇ©ÇËÇ≈Ç∑Ç©ÅBÇæÇ¢ÇΩÇ¢ÇÌÇ©ÇËÇ‹Ç∑ÇÀÅBDZÇÍÇÕà¯Ç¡Ç©ÇØÇÃéøñ‚Ç≈ÅAÇfiÇ∏ǩǵǢÇΔDZÇÎÇ‹Ç≈îÚnjǵǃǵNjǮǧÇΔÇ∑ÇÈêlÇ…íçà”Çä´ãNÇ∑ÇÈÇΩÇflÇ≈Ç∑ÅBTEGetPoint
ÇÕ Point
Çï‘ǵNjÇ∑ÅBñ‚ëËÇÕdžÇËÇ‹ÇπÇÒÅBǪÇÍÇÕå^ïœä∑Ç∑ÇÍÇŒÇÊÇ¢ÇÃÇ≈Ç∑ÅBǂǡǃǛǃÇ≠ÇæÇ≥Ç¢ÅBǮǡÇΔÅAÉqÉÖÅ[ÉXÉgÉìÅAñ‚ëËÇ™ãNDZǡÇΩÅBÉRÉìÉpÉCÉâÇ™ÅuÉGÉâÅ[:
ñæé¶ìIÇ»å^ïœä∑Ç™ïsê≥ - 'long' Ç©ÇÁ 'struct
Point'ÅvÇΔï∂ãÂÇåæÇ¡ÇƒÇ¢Ç‹Ç∑ÅBDZÇÍÇâÒîÇ∑ÇÈÇ…ÇÕÅAåãâ ÇÉçÅ[ÉJÉãïœêîÇ…ï€ä«ÇµÅAǪÇÃÉAÉhÉåÉXÇ
Point
Ç÷ÇÃÉ|ÉCÉìÉ^Ç…å^ïœä∑ǵǻÇ≠ǃÇÕÇ»ÇËÇ‹ÇπÇÒÅBǪǵǃÅAéüÇÃÇÊǧDžÅAÉ|ÉCÉìÉ^Ç©ÇÁílÇéÊÇËèoǵǃê≥ämÇ»åãâ ÇìæÇ‹Ç∑ÅB
static Point TEGetPoint(short offset,TEHandle hTE)
{
// THREEWORDINLINE(0x3F3C, 0x0008, 0xA83D);
// MOVE.W #$0008,-(A7)
// _TEDispatch
// _TEGetPoint is A83D (_TEDispatch) when A7^.W=0008
// A7^.W=0008 ÇÃÇΔÇ´ _TEGetPoint ÇÕ A83D (_TEDispatch)
long private_results = CallUniversalProc(
GetToolboxTrapAddress(_TEDispatch), // ÉfÉBÉXÉpÉbÉ`ÉÉÅ[ÇÃÉAÉhÉåÉX
kStackDispatchedPascalStackBased | // proc info
RESULT_SIZE(SIZE_CODE(sizeof(Point))) |
DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode) |
DISPATCHED_STACK_ROUTINE_PARAMETER(1,
SIZE_CODE(sizeof(short))) |
DISPATCHED_STACK_ROUTINE_PARAMETER(2,
SIZE_CODE(sizeof(TEHandle))),
0x0008, // selector
offset, hTE // parameter(s)
);
return *(Point*) &private_results;
}
|
ç\ë¢ëÃÇÃÉTÉCÉYÇ™ 4
ÉoÉCÉgÇÃèÍçáÇÕDZÇÍÇ≈Ç∑Ç◊ǃǧNjÇ≠ǢǴNjÇ∑ÅBǵǩǵÅA4
ÉoÉCÉgÇÊÇËè¨Ç≥Ç¢èÍçáÇÕǫǧǻÇÈÇÃÇ≈ǵÇÂǧÅBéüÇÃÉTÉìÉvÉãÇééǵǃÇ≠ÇæÇ≥Ç¢ÅB
typedef struct CryptoCharsRecord {
char findChar;
char replaceChar;
} CryptoCharsRec, *CryptoCharsPtr, **CryptoCharsHdl;
|
CallUniversalProc Ç©ÇÁï‘Ç≥ÇÍÇÈDZÇÃç\ë¢ëÃÇ long
ÇÃåãâ Ç…ï€ë∂Ç∑ÇÈèÍçáÅAéüÇÃÇÊǧDžǻÇËÇ‹Ç∑ (Mac OS
ÇÕè„à ÉoÉCÉgÇêÊÇ…ÅAâ∫à ÉoÉCÉgÇå„Ç…ï€ë∂Ç∑ÇÈDZÇΔÇévÇ¢èoǵǃÇ≠ÇæÇ≥Ç¢)ÅB
+---------------------------+
Low Mem | 0 | <-- private_result ÇÃÉAÉhÉåÉX
+---------------------------+
| 1 |
+---------------------------+
| 2 | findChar
+---------------------------+
High Mem| 3 | replaceChar
+---------------------------+
|
DZÇÃèÍçáÅAíPèÉÇ»å^ïœä∑LJÉ|ÉCÉìÉ^Ç©ÇÁéÊÇËèoǵÇΩílÇÃå^ïœä∑LJǧNjÇ≠ǢǴNjÇπÇÒÅBÇ‚ÇËÇ©ÇΩÇÕÅAåãâ ÇÃÉAÉhÉåÉXÇ…è„à ÉèÅ[ÉhÇ÷ÇÃÉIÉtÉZÉbÉgÇâ¡Ç¶ÇΩLJÇÃÇ©ÇÁílÇéÊÇËèoǵNjÇ∑ÅB
pascal CryptoCharsRec GetEncodeKey(char* pThePassword)
{
long private_results = CallUniversalProc(
GetToolboxTrapAddress(0xAxxx),
kPascalStackBased |
RESULT_SIZE(SIZE_CODE(sizeof(Boolean))) |
STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(EventRecord*)))
theEvent // the parameter
);
return *(((CryptoCharsRec*)&private_result) + 1);
}
|
àÍå©ÇµÇƒÅAÉIÉtÉZÉbÉgÇ™ 2
Ç≈Ç»ÇØÇÍnjǻÇÁǻǢÇΔévǧǩLJǵÇÍÇ‹ÇπÇÒÇ™ÅADZÇÃèÍçáÇÕÉoÉCÉgÇÃÉIÉtÉZÉbÉgÇ≈Ç»Ç≠ÅA2
ÉoÉCÉgÇÃç\ë¢ëÃÇÃÉIÉtÉZÉbÉgÇæÇΔǢǧDZÇΔÇévÇ¢èoǵǃÇ≠ÇæÇ≥Ç¢ÅBC
åæåÍÇÕDZÇÃDZÇΔÇîFéØÇµÇƒÇ®ÇËÅA1 Ç≈ÇÕÇ»Ç≠ 2
Çâ¡éZǵNjÇ∑ÅBDZǧǵÇΩÉIÉtÉZÉbÉgÇÃåvéZÇÕîÒèÌÇ…ä‘à·Ç¢Ç‚Ç∑Ç¢ÇÃÇ≈ÅAïœêîÇ‹ÇΩÇÕïœêîå^Ç™ó^ǶÇÁÇÍÇΩèÍçáÇ…ÉIÉtÉZÉbÉgÇåvéZÇ∑ÇÈÉ}ÉNÉçÇDZDZDžè–âÓǵǃǮǴNjÇ∑ÅB
#define RESULT_OFFSET(type) \
((sizeof(type) == 1) ? 3 : ((sizeof(type) == 2) ? 1 : 0))
|
âΩLJÇfiÇ∏ǩǵǢDZÇΔÇÕdžÇËÇ‹ÇπÇÒÅBç\ë¢ëÃÇÃÉTÉCÉYÇ™ 1
ÇæÇ¡ÇΩÇÁÅAè„à ÉoÉCÉgÇ÷ÇÃÉIÉtÉZÉbÉgÅA3 (ÉoÉCÉg)
Ç…Ç»ÇËÇ‹Ç∑ÅBç\ë¢ëÃÇÃÉTÉCÉYÇ™ 2
ÇæÇ¡ÇΩÇÁÅAè„à ÉèÅ[ÉhÇ÷ÇÃÉIÉtÉZÉbÉgÅA1 (ÉèÅ[Éh)
Ç…Ç»ÇËÇ‹Ç∑ÅBDZÇÃÇ¢Ç∏ÇÍÇ≈Ç‡Ç»ÇØÇÍÇŒÉIÉtÉZÉbÉgÇÕÉ[ÉçÇ≈Ç∑ÅBDZÇÍÇÕéüÇÃÇÊǧDžégópǵNjÇ∑ÅB
pascal CryptoCharsRec Get_Encode_Key(char* pThePassword)
{
long private_results = CallUniversalProc(
GetToolboxTrapAddress(0xA911),
kPascalStackBased |
RESULT_SIZE(SIZE_CODE(sizeof(Boolean))) |
STACK_ROUTINE_PARAMETER(1,
SIZE_CODE(sizeof(EventRecord*)))
theEvent // the parameter
);
return *(((CryptoCharsRec*)&private_result) +
RESULT_OFFSET(CryptoCharsRec));
}
|
Ç®ÇÌÇ©ÇËÇ≈Ç∑Ç©ÅBÇ≈ÇÕÅAåãâ Ç™ 4
ÉoÉCÉgÇÊÇËLJëÂǴǩǡÇΩÇÁǫǧǻÇÈÇ≈ǵÇÂǧǩÅBDZÇÃèÍçáÅACallUniversalProc
ÇégópǵǃÉãÅ[É`ÉìÇåƒÇ—èoÇ∑DZÇΔÇÕÇ≈Ç´Ç‹ÇπÇÒÅBéÑÇ™å©ÇΩ
(É}ÉVÉìÇ™ê∂ê¨ÇµÇΩ) ÉOÉãÅ[ÉRÅ[ÉhÇ…ÇÕÅAéüÇÃÇÊǧDžÅAåãâ Ç™
CallUniversalProc
ÇÃèàóùâ¬î\Ç»ÉTÉCÉYÇÊÇËLJëÂǴǢǩǫǧǩÉeÉXÉgÇ∑ÇÈLJÇÃǙdžÇËNjǵÇΩÅB
#ifdef applec
#if sizeof(OSErr) > 4
#error "Result types larger than 4 bytes are not supported."
#endif
#endif
|
é¿ç€ÇÃÉTÉìÉvÉã
é¿ç€Ç… InterfaceLib Ç©ÇÁåáóéǵǃǢÇÈ API
ÇÇ¢Ç≠Ǭǩå©ÇƒÇ›Ç‹ÇµÇÂǧÅBÇ‹Ç∏ÅACursor Device Manager Çà API
Ç≈Ç∑ÅB
pascal OSErr CursorDeviceMoveTo(CursorDevicePtr ourDevice, long absX, long absY)
{
// TWOWORDINLINE(0x7001, 0xAADB);
// MOVEQ #$01,D0 | 7001
// _CursorDeviceDispatch | AADB
return (OSErr) CallUniversalProc(
(UniversalProcPtr)GetToolboxTrapAddress(0xAADB),
kD0DispatchedPascalStackBased |
RESULT_SIZE(SIZE_CODE(sizeof(OSErr))) |
DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kFourByteCode) |
DISPATCHED_STACK_ROUTINE_PARAMETER(1,
SIZE_CODE(sizeof(ourDevice))) |
DISPATCHED_STACK_ROUTINE_PARAMETER(2,
SIZE_CODE(sizeof(absX))) |
DISPATCHED_STACK_ROUTINE_PARAMETER(3,
SIZE_CODE(sizeof(absY))),
0x00000001, // selector
ourDevice, absX, absY); // parameter(s)
}
|
éüÇÕ OSUtils.h ÇÃåáóé API Ç≈Ç∑ÅB
static pascal OSErr FlushCodeCacheRange(void *address, unsigned long count)
{
// TWOWORDINLINE(0x7009, 0xA098);
// MOVEQ #$09,D0| 7009
// _HWPriv | A098
return (OSErr) CallOSTrapUniversalProc(
GetOSTrapAddress(_HWPriv),
kRegisterBased
| RESULT_SIZE (SIZE_CODE (sizeof (OSErr)))
| REGISTER_RESULT_LOCATION (kRegisterD0)
| REGISTER_ROUTINE_PARAMETER(1,kRegisterA0,
SIZE_CODE(sizeof(address)))
| REGISTER_ROUTINE_PARAMETER(2,kRegisterA1,
SIZE_CODE(sizeof(count)))
address,count); // parameter(s)
}
|
éüÇà API ÇÕ InterfaceLib DžLJÉwÉbÉ_DžLJdžÇËÇ‹ÇπÇÒ
(DZDZNjÇ≈ì«ÇÒÇ≈Ç≠ÇæÇ≥Ç¡ÇΩï˚Ç÷ÇÃÇ®óÁÇÃà”ñ°ÇDZÇflǃ)ÅB
pascal ComponentResult TVSetFrequency(TVTunerComponent ci, long frequency)
//FIVEWORDINLINE(0x2F3C, 0x04, kSelectTVSetFrequency, 0x7000, 0xA82A);
// MOVE.L #$00040001,-(A7)
// MOVEQ #$00,D0
// _ComponentDispatch
{
return (ComponentResult) CallUniversalProc(
(UniversalProcPtr) GetToolboxTrapAddress(0xA82A),
kD0DispatchedPascalStackBased |
RESULT_SIZE(SIZE_CODE(sizeof(ComponentResult))) |
DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode) |
DISPATCHED_STACK_ROUTINE_PARAMETER( 1,
SIZE_CODE(sizeof(long))) |
DISPATCHED_STACK_ROUTINE_PARAMETER( 2,
SIZE_CODE(sizeof(TVTunerComponent))) |
DISPATCHED_STACK_ROUTINE_PARAMETER( 3,
SIZE_CODE(sizeof(long))),
0x0000, // D0 selector
0x00040001, // Stack dispatched selector
ci, frequency); // parameter(s)
}
|
äÆëSÇ»ÉTÉìÉvÉã:
HFS+
HFS+ópÇÃ eXtended DiskInit
ÉãÅ[É`ÉìÇÃäÆëSÇ»ÉOÉãÅ[ÉtÉ@ÉCÉãÇéüÇ…åfç⁄ǵNjÇ∑ÅB
/*
File: DiskInit.Glue.c
Å@
Copyright: © 1984-1997 by Apple Computer, Inc.
All rights reserved.
*/
Å@
#include <DiskInit.h>
#include <MixedMode.h>
Å@
static UniversalProcPtr gPack2TrapUPP = kUnresolvedCFragSymbolAddress;
static UniversalProcPtr gUnimplementedUPP = kUnresolvedCFragSymbolAddress;
Å@
pascal OSErr DIXFormat(short drvNum, Boolean fmtFlag,
unsigned long fmtArg, unsigned long *actSize)
// THREEWORDINLINE(0x700C, 0x3F00, 0xA9E9);
// MOVEQ #$0C,D0 | 700C
// MOVE.W D0,-(A7) | 3F00
// _Pack2 | A9E9
{
long private_result = unimpErr; // ñ¢é¿ëïÇà A ÉgÉâÉbÉvÇâºíË
Å@
if ((Ptr) gUnimplementedUPP == (Ptr) kUnresolvedCFragSymbolAddress)
gUnimplementedUPP = GetToolboxTrapAddress(_Unimplemented);
Å@
if ((Ptr) gPack2TrapUPP == (Ptr) kUnresolvedCFragSymbolAddress)
gPack2TrapUPP = GetToolboxTrapAddress(0xA9E9);
Å@
if ((Ptr) gPack2TrapUPP != (Ptr) gUnimplementedUPP)
{
private_result = CallUniversalProc(gPack2TrapUPP,
kStackDispatchedPascalStackBased |
RESULT_SIZE(SIZE_CODE(sizeof(OSErr))) |
DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode) |
DISPATCHED_STACK_ROUTINE_PARAMETER(1,
SIZE_CODE(sizeof(short))) |
DISPATCHED_STACK_ROUTINE_PARAMETER(2,
SIZE_CODE(sizeof(Boolean))) |
DISPATCHED_STACK_ROUTINE_PARAMETER(3,
SIZE_CODE(sizeof(unsigned long))) |
DISPATCHED_STACK_ROUTINE_PARAMETER(4,
SIZE_CODE(sizeof(unsigned long))),
0x000C, // selector
drvNum, fmtFlag, fmtArg, actSize); // parameter(s)
}
return (OSErr) private_result;
}
Å@
pascal OSErr DIXZero(short drvNum, ConstStr255Param volName,
short fsid, short mediaStatus, short volTypeSelector,
unsigned long volSize, void *extendedInfoPtr)
// THREEWORDINLINE(0x700E, 0x3F00, 0xA9E9);
// MOVEQ #$0E,D0 | 700E
// MOVE.W D0,-(A7) | 3F00
// _Pack2 | A9E9
{
long private_result = unimpErr; // ñ¢é¿ëïÇà A ÉgÉâÉbÉvÇâºíË
Å@
if ((Ptr) gUnimplementedUPP == (Ptr) kUnresolvedCFragSymbolAddress)
gUnimplementedUPP = GetToolboxTrapAddress(_Unimplemented);
Å@
if ((Ptr) gPack2TrapUPP == (Ptr) kUnresolvedCFragSymbolAddress)
gPack2TrapUPP = GetToolboxTrapAddress(0xA9E9);
Å@
if ((Ptr) gPack2TrapUPP != (Ptr) gUnimplementedUPP)
{
private_result = CallUniversalProc(gPack2TrapUPP,
kStackDispatchedPascalStackBased |
RESULT_SIZE(SIZE_CODE(sizeof(OSErr))) |
DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode) |
DISPATCHED_STACK_ROUTINE_PARAMETER(1,
SIZE_CODE(sizeof(short))) |
DISPATCHED_STACK_ROUTINE_PARAMETER(2,
SIZE_CODE(sizeof(ConstStr255Param))) |
DISPATCHED_STACK_ROUTINE_PARAMETER(3,
SIZE_CODE(sizeof(short))) |
DISPATCHED_STACK_ROUTINE_PARAMETER(4,
SIZE_CODE(sizeof(short))) |
DISPATCHED_STACK_ROUTINE_PARAMETER(5,
SIZE_CODE(sizeof(short))) |
DISPATCHED_STACK_ROUTINE_PARAMETER(6,
SIZE_CODE(sizeof(unsigned long))) |
DISPATCHED_STACK_ROUTINE_PARAMETER(7,
SIZE_CODE(sizeof(void *))),
0x000E, // selector
drvNum, volName, fsid, mediaStatus, // parameter(s)
volTypeSelector, volSize, extendedInfoPtr);
}
return (OSErr) private_result;
}
Å@
pascal OSErr DIReformat(short drvNum, short fsid,
ConstStr255Param volName, ConstStr255Param msgText)
// THREEWORDINLINE(0x7010, 0x3F00, 0xA9E9);
// MOVEQ #$10,D0 | 7010
// MOVE.W D0,-(A7) | 3F00
// _Pack2 | A9E9
{
long private_result = unimpErr; // ñ¢é¿ëïÇà A ÉgÉâÉbÉvÇâºíË
Å@
if ((Ptr) gUnimplementedUPP == (Ptr) kUnresolvedCFragSymbolAddress)
gUnimplementedUPP = GetToolboxTrapAddress(_Unimplemented);
Å@
if ((Ptr) gPack2TrapUPP == (Ptr) kUnresolvedCFragSymbolAddress)
gPack2TrapUPP = GetToolboxTrapAddress(0xA9E9);
Å@
if ((Ptr) gPack2TrapUPP != (Ptr) gUnimplementedUPP)
{
private_result = CallUniversalProc(gPack2TrapUPP,
kStackDispatchedPascalStackBased |
RESULT_SIZE(SIZE_CODE(sizeof(OSErr))) |
DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode) |
DISPATCHED_STACK_ROUTINE_PARAMETER(1,
SIZE_CODE(sizeof(short))) |
DISPATCHED_STACK_ROUTINE_PARAMETER(2,
SIZE_CODE(sizeof(short))) |
DISPATCHED_STACK_ROUTINE_PARAMETER(3,
SIZE_CODE(sizeof(ConstStr255Param))) |
DISPATCHED_STACK_ROUTINE_PARAMETER(4,
SIZE_CODE(sizeof(ConstStr255Param))),
0x0010, // selector
drvNum, fsid, volName, msgText); // parameter(s)
}
return (OSErr) private_result;
}
|
äÆëSÇ»ÉTÉìÉvÉã:
ControlStrip
/*
File: ControlStrip.Glue.c
Copyright: © 1984-1997 by Apple Computer, Inc.
All rights reserved.
*/
Å@
#include <MixedMode.h>
#include <ControlStrip.h>
Å@
static UniversalProcPtr gControlStripTrapUPP = kUnresolvedCFragSymbolAddress;
static UniversalProcPtr gUnimplementedUPP = kUnresolvedCFragSymbolAddress;
Å@
#define _ControlStripDispatch 0xAAF2
Å@
pascal Boolean SBIsControlStripVisible(void)
// TWOWORDINLINE(0x7000, 0xAAF2);
// MOVEQ #$00,D0
// _ControlStripDispatch
{
long private_result = 0L;
Å@
if ((Ptr) gUnimplementedUPP == (Ptr) kUnresolvedCFragSymbolAddress)
gUnimplementedUPP =
GetToolboxTrapAddress(_Unimplemented);
Å@
if ((Ptr) gControlStripTrapUPP == (Ptr) kUnresolvedCFragSymbolAddress)
gControlStripTrapUPP =
GetToolboxTrapAddress(_ControlStripDispatch);
Å@
if ((Ptr) gControlStripTrapUPP != (Ptr) gUnimplementedUPP)
{
private_result = CallUniversalProc(gControlStripTrapUPP,
kD0DispatchedPascalStackBased |
DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode) |
RESULT_SIZE(SIZE_CODE(sizeof(Boolean))),
0x0000); // selector
}
return (Boolean) private_result;
}
Å@
pascal void SBShowHideControlStrip(Boolean showIt)
// THREEWORDINLINE(0x303C, 0x0101, 0xAAF2);
// MOVE.W #$0101,D0
// _ControlStripDispatch
{
if ((Ptr) gUnimplementedUPP == (Ptr) kUnresolvedCFragSymbolAddress)
gUnimplementedUPP = GetToolboxTrapAddress(_Unimplemented);
Å@
if ((Ptr) gControlStripTrapUPP == (Ptr) kUnresolvedCFragSymbolAddress)
gControlStripTrapUPP = GetToolboxTrapAddress(_ControlStripDispatch);
Å@
if ((Ptr) gControlStripTrapUPP != (Ptr) gUnimplementedUPP)
{
CallUniversalProc(gControlStripTrapUPP,
kD0DispatchedPascalStackBased |
DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode) |
DISPATCHED_STACK_ROUTINE_PARAMETER(1,
SIZE_CODE(sizeof(Boolean))),
0x0101, // selector
showIt); // parameter(s)
}
}
|
äÆëSÇ»ÉTÉìÉvÉã:
Power Manager
/*
File: Power.Glue.c
Copyright: © 1984-1997 by Apple Computer, Inc.
All rights reserved.
*/
Å@
#include <MixedMode.h>
#include <Power.h>
Å@
static UniversalProcPtr gPowerTrapUPP = kUnresolvedCFragSymbolAddress;
static UniversalProcPtr gUnimplementedUPP = kUnresolvedCFragSymbolAddress;
Å@
pascal Boolean HardDiskPowered(void)
// TWOWORDINLINE(0x7006, 0xA09E);
// MOVEQ #$06,D0 | 7006 ; Move selector
// _PowerMgr | A09E ; for _HardDiskPowered
{
long private_result = 0L;
Å@
if ((Ptr) gUnimplementedUPP == (Ptr) kUnresolvedCFragSymbolAddress)
gUnimplementedUPP = GetToolboxTrapAddress(_Unimplemented);
Å@
if ((Ptr) gPowerTrapUPP == (Ptr) kUnresolvedCFragSymbolAddress)
gPowerTrapUPP = GetToolboxTrapAddress(0xA09E);
Å@
if ((Ptr) gPowerTrapUPP != (Ptr) gUnimplementedUPP)
{
private_result = CallUniversalProc(gPowerTrapUPP,
kD0DispatchedPascalStackBased |
DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode) |
RESULT_SIZE(SIZE_CODE(sizeof(Boolean))),
0x0006); // selector
}
return (OSErr) private_result;
}
Å@
pascal void SpinDownHardDisk(void)
// TWOWORDINLINE(0x7007, 0xA09E);
// MOVEQ #$07,D0 | 7006 ; Move selector
// _PowerMgr | A09E ; for _SpinDownHardDisk
{
if ((Ptr) gUnimplementedUPP == (Ptr) kUnresolvedCFragSymbolAddress)
gUnimplementedUPP = GetToolboxTrapAddress(_Unimplemented);
Å@
if ((Ptr) gPowerTrapUPP == (Ptr) kUnresolvedCFragSymbolAddress)
gPowerTrapUPP = GetToolboxTrapAddress(0xA09E);
Å@
if ((Ptr) gPowerTrapUPP != (Ptr) gUnimplementedUPP)
{
CallUniversalProc(gPowerTrapUPP,
kD0DispatchedPascalStackBased |
DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode),
0x0007); // selector
}
}
Å@
pascal Boolean IsSpindownDisabled(void)
// TWOWORDINLINE(0x7008, 0xA09E);
// MOVEQ #$08,D0 ; Move selector
// _PowerMgr ; for _IsSpindownDisabled
{
long private_result = 0L;
Å@
if ((Ptr) gUnimplementedUPP == (Ptr) kUnresolvedCFragSymbolAddress)
gUnimplementedUPP = GetToolboxTrapAddress(_Unimplemented);
Å@
if ((Ptr) gPowerTrapUPP == (Ptr) kUnresolvedCFragSymbolAddress)
gPowerTrapUPP = GetToolboxTrapAddress(0xA09E);
Å@
if ((Ptr) gPowerTrapUPP != (Ptr) gUnimplementedUPP)
{
private_result = CallUniversalProc(gPowerTrapUPP,
kD0DispatchedPascalStackBased |
DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode) |
RESULT_SIZE(SIZE_CODE(sizeof(Boolean))),
0x0008); // selector
}
return (OSErr) private_result;
}
Å@
// DZÇÍÇÁ 2 ǬÇà API ÇÕ A ÉgÉâÉbÉvÇ≈ D0 ÇÃè„à ÉèÅ[ÉhÇ…ò_óùílÇì¸ÇÍǃìnÇ∑
// ÇΔǢǧïœë•ìIǻLJÇÃÇ≈Ç∑ÅBâ∫à ÉèÅ[ÉhÇ…ÇÕÉZÉåÉNÉ^Ç™ì¸ÇËÇ‹Ç∑ÅB
// (ïœÇ≈Ç∑ÇÀ)
Å@
pascal void SetSpindownDisable(Boolean setDisable)
// FOURWORDINLINE(0x4840, 0x303C, 0x0009, 0xA09E);
// SWAP D0 ; Move setDisable to high-Word of D0
// MOVE.W #$0009,D0 ; Move selector to low-Word of D0
// _PowerMgr ; for _SetSpindownDisable
{
if ((Ptr) gUnimplementedUPP == (Ptr) kUnresolvedCFragSymbolAddress)
gUnimplementedUPP = GetToolboxTrapAddress(_Unimplemented);
Å@
if ((Ptr) gPowerTrapUPP == (Ptr) kUnresolvedCFragSymbolAddress)
gPowerTrapUPP = GetToolboxTrapAddress(0xA09E);
Å@
if ((Ptr) gPowerTrapUPP != (Ptr) gUnimplementedUPP)
CallUniversalProc(gPowerTrapUPP,
kD0DispatchedPascalStackBased |
DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode),
(setDisable << 16) | 0x0009); // selector
}
Å@
pascal void AutoSleepControl(Boolean enableSleep)
// FOURWORDINLINE(0x4840, 0x303C, 0x000D, 0xA09E);
// SWAP D0 ; Move setDisable to high-Word of D0
// MOVE.W #$000D,D0 ; Move selector to low-Word of D0
// _PowerMgr ; for _AutoSleepControl
{
if ((Ptr) gUnimplementedUPP == (Ptr) kUnresolvedCFragSymbolAddress)
gUnimplementedUPP = GetToolboxTrapAddress(_Unimplemented);
Å@
if ((Ptr) gPowerTrapUPP == (Ptr) kUnresolvedCFragSymbolAddress)
gPowerTrapUPP = GetToolboxTrapAddress(0xA09E);
Å@
if ((Ptr) gPowerTrapUPP != (Ptr) gUnimplementedUPP)
CallUniversalProc(gPowerTrapUPP,
kD0DispatchedPascalStackBased |
DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode),
(enableSleep << 16) | 0x000D); // selector
}
|
óvñÒ
DZÇÍÇ≈ÅAInterfaceLib
Ç©ÇÁåáóéǵǃǢÇÈÉãÅ[É`ÉìÇ∑Ç◊ǃÇÃÉOÉãÅ[ÇèëÇ≠ï˚ñ@Çè–âÓǵNjǵÇΩÇ©ÇÁÅALJǧåæÇ¢ñÛÇÕÇ≈Ç´Ç‹ÇπÇÒÇÀÅBç°Ç±ÇªÅAÇ∑ÇŒÇÁǵǢ
CFM ÉAÉvÉäÉPÅ[ÉVÉáÉìÇèëÇ≠Ç◊Ç´ÇΔÇ´Ç≈Ç∑ÅB
Å@
éQçlï∂å£
- ÅwInside Macintosh: PowerPC System SoftwareÅxÇÃëÊ 2
èÕÅuMixed Mode ManagerÅv
- Joe Zobkiw íòÅwA Fragment of Your ImaginationÅx
(ISBN:0-201-48358)
|